// 函数先后关系

#include <stdio.h>

// 函数的原型声明，旧版本一般写在 main 中
// 声明部分可以不写变量名
// void sum(int, int);
void sum(int begin, int end);

// 如果不写参数，编译器会认为参数类型不确定
// 在运行时编译器会按照输入猜测参数类型
// 而如果实际形参类型与实参类型不一致，则会发生错误
// 因此，在原型声明时，有参数就写上；没有就 void，别空着
// void foo(void);

// 此外，C语言不允许函数嵌套定义，只允许包含函数的声明

int main(void)
{
    // 如果把要调用的函数放在后面，编译器可能就会猜一个函数
    // 这种做法可能导致报错，因此需要提前声明
    sum(1, 10);
    // 调用函数时，可以用数字，变量，表达式等
    // 如果实参与形参类型不匹配，C语言会进行强制类型转换
    // 函数中的变量作用域只存在于函数内，出了函数就消失了
    sum(20, 30);
    // 以下写法，括号里表示逗号运算
    sum((1, 5), (3, 4));
    
    return 0;
}

void sum(int begin, int end)
{
    printf("sum %d and %d is %d\n", begin, end, begin + end);
}